/** * This file is part of Technic Launcher Core. * Copyright ©2015 Syndicate, LLC * * Technic Launcher Core is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Technic Launcher Core is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License, * as well as a copy of the GNU Lesser General Public License, * along with Technic Launcher Core. If not, see <http://www.gnu.org/licenses/>. */ package net.technicpack.utilslib.maven; import net.technicpack.launchercore.install.LauncherDirectories; import net.technicpack.launchercore.util.DownloadListener; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.collection.DependencyCollectionException; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.impl.DefaultServiceLocator; import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.DependencyResolutionException; import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.transfer.TransferListener; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.transport.http.HttpTransporterFactory; import java.util.ArrayList; import java.util.List; public class MavenConnector { private List<RemoteRepository> defaultRepositories; private RepositorySystem system; private DefaultRepositorySystemSession session; public MavenConnector(LauncherDirectories directories, String... defaultRepositories) { DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); locator.setErrorHandler(new DefaultServiceLocator.ErrorHandler() { @Override public void serviceCreationFailed(Class<?> type, Class<?> impl, Throwable exception) { exception.printStackTrace(); } }); locator.addService( RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class ); locator.addService( TransporterFactory.class, FileTransporterFactory.class ); locator.addService( TransporterFactory.class, HttpTransporterFactory.class ); this.system = locator.getService( RepositorySystem.class ); this.session = MavenRepositorySystemUtils.newSession(); LocalRepository localRepository = new LocalRepository(directories.getCacheDirectory()); session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepository)); this.defaultRepositories = new ArrayList<RemoteRepository>(defaultRepositories.length/2); for (int i = 0; i < defaultRepositories.length/2; i++) { String key = defaultRepositories[i*2]; String url = defaultRepositories[i*2+1]; this.defaultRepositories.add(new RemoteRepository.Builder(key, "default", url).build()); } } public boolean attemptLibraryDownload(String name) { return attemptLibraryDownload(name, null, null); } public boolean attemptLibraryDownload(String name, DownloadListener listener) { return attemptLibraryDownload(name, null, listener); } public boolean attemptLibraryDownload(String name, String url, DownloadListener listener) { Dependency dependency = new Dependency(new DefaultArtifact(name), "compile"); CollectRequest collectRequest = new CollectRequest(); collectRequest.setRoot(dependency); if (url != null) collectRequest.addRepository(new RemoteRepository.Builder("targetted", "default", url).build()); for (RemoteRepository repo : defaultRepositories) { collectRequest.addRepository(repo); } try { DependencyNode node = system.collectDependencies(session, collectRequest).getRoot(); DependencyRequest dependencyRequest = new DependencyRequest(); dependencyRequest.setRoot(node); if (listener != null) session.setTransferListener(new MavenListenerAdapter(listener)); system.resolveDependencies(session, dependencyRequest); return true; } catch (DependencyCollectionException ex) { return false; } catch (DependencyResolutionException ex) { return false; } } }